package com.hd123.rumba.gwt.widget2.client.dialog;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasAlignment;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.hd123.rumba.gwt.widget2.client.form.RTextBox;

/**
 * 输入对话框
 * 
 * @author LiQi
 * 
 */
public class RInputBox extends RDialog {

  /** 样式 */
  public static final String STYLENAME_MESSAGE = "rb-InputBox-message";

  /** 输入框的默认标题 */
  public static final String DEFAULT_TITLE = "请输入";

  /** 提示用户输入的说明文字 */
  private HTML message;

  /** 文本框 */
  private RTextBox textBox;

  /** 是否允许输入空串 */
  private boolean nullable = true;

  /** OK按钮定义 */
  private ButtonConfig okButton;

  public RInputBox() {
    super(false, true);
    setWorkingAreaPadding(25);
    setShowCloseButton(false);
    setEscKeyToHide(true);

    VerticalPanel root = new VerticalPanel();
    root.setWidth("260px");

    message = new HTML();
    message.setWidth("100%");
    root.add(message);

    textBox = new CustomTextBox();
    textBox.setInputWidth("260px");
    root.add(textBox);
    root.setCellHeight(textBox, "26px");
    root.setCellVerticalAlignment(textBox, HasAlignment.ALIGN_BOTTOM);

    setWidget(root);

    okButton = new ButtonConfig("确定", false);
    setButtons(new ButtonConfig[] {
        okButton, BUTTON_CANCEL });
    getButton(okButton).addClickHandler(new ClickHandler() {
      public void onClick(ClickEvent event) {
        if (!nullable && getText().equals("")) {
          Window.alert("输入内容不能为空");
          textBox.setFocus(true);
        } else
          hide();
      }
    });
  }

  /**
   * 显示输入框，允许输入空串
   * 
   * @param message
   *          提示用户输入的说明文字。允许null。
   * @param defaultValue
   *          文本框的默认内容。允许null。
   * @param callback
   *          回调
   */
  public static void show(String message, String defaultValue, Callback callback) {
    show(null, message, defaultValue, true, callback);
  }

  /**
   * 显示输入框
   * 
   * @param message
   *          提示用户输入的说明文字。允许null。
   * @param defaultValue
   *          文本框的默认内容。允许null。
   * @param nullable
   *          是否允许输入空串
   * @param callback
   *          回调
   */
  public static void show(String message, String defaultValue, boolean nullable,
      final Callback callback) {
    show(null, message, defaultValue, nullable, callback);
  }

  /**
   * 显示输入框
   * 
   * @param title
   *          输入对话框的标题。允许null，表示使用默认的{@link #DEFAULT_TITLE} 。
   * @param message
   *          提示用户输入的说明文字。允许null。
   * @param defaultValue
   *          文本框的默认内容。允许null。
   * @param nullable
   *          是否允许输入空串
   * @param callback
   *          回调
   */
  public static void show(String title, String message, String defaultValue, boolean nullable,
      final Callback callback) {
    RInputBox inputBox = new RInputBox();

    if (title == null)
      title = DEFAULT_TITLE;
    inputBox.setCaptionText(title);

    inputBox.setMessage(message);
    inputBox.setText(defaultValue);
    inputBox.setNullable(nullable);

    if (callback != null) {
      inputBox.addCloseHandler(new CloseHandler<PopupPanel>() {
        public void onClose(CloseEvent<PopupPanel> event) {
          RInputBox inputBox = ((RInputBox) event.getSource());
          boolean ok = inputBox.getClickedButton() != null
              && inputBox.getClickedButton().equals(inputBox.okButton);
          String text = ok ? inputBox.getText() : null;
          callback.onClosed(ok, text);
        }
      });
    }

    inputBox.center();
  }

  /**
   * 提示用户输入的说明文字
   * 
   * @param message
   */
  public void setMessage(String message) {
    this.message.setHTML(message);
  }

  /**
   * 文本框内容
   * 
   */
  public String getText() {
    return textBox.getValue();
  }

  /**
   * 设置文本框内容
   * 
   * @param text
   */
  public void setText(String text) {
    textBox.setValue(text);
  }

  /**
   * 是否允许输入空串
   * 
   * @return
   */
  public boolean isNullable() {
    return nullable;
  }

  /**
   * 设置是否允许输入空串
   * 
   * @param nullable
   */
  public void setNullable(boolean nullable) {
    this.nullable = nullable;
  }

  public void show() {
    super.show();

    DeferredCommand.addCommand(new Command() {
      public void execute() {
        textBox.setFocus(true);
        textBox.selectAll();
      }
    });
  }

  /**
   * 文本框，增加特性：回车时点击确定按钮。
   * 
   * @author LiQi
   * 
   */
  private class CustomTextBox extends RTextBox {
    protected int onKeyEnter() {
      textBox.setFocus(false);
      getButton(okButton).click();
      return KeyCodes.KEY_ENTER;
    }
  }

  /**
   * 输入框回调接口
   * 
   * @author LiQi
   * 
   */
  public static interface Callback {

    /**
     * 当输入框关闭时触发
     * 
     * @param ok
     *          是否点击了OK按钮
     * @param text
     *          输入的文本，如果ok==false，则text为null
     */
    void onClosed(boolean ok, String text);
  }
}
